#include<cairo.h>
#include<stdio.h>

int
main(int argc, char* argv[]){
  unsigned int count1, count2;
  cairo_surface_t *sfc1 = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1000, 1000);
  count1 = cairo_surface_get_reference_count(sfc1);
  printf("surface对象刚创建时的引用计数：%u\n\n", count1);
  cairo_t *cr1 = cairo_create(sfc1);

  // 获取surface对象的引用计数
  count1 = cairo_surface_get_reference_count(sfc1);
  // 获取cairo对象的引用计数
  count2 = cairo_get_reference_count(cr1);
  printf("cairo对象刚创建时：\nsurface对象的引用计数：%u\n可见cairo_create(sfc1);函数获取了两个对surface对象的引用\ncairo对象自己的引用计数: %u\n\n", count1, count2);

  // 获取新的对sfc1指向对象的引用sfc2
  cairo_surface_t *sfc2 = cairo_surface_reference(sfc1);
  // 获取新的对cr1指向对象的引用cr2
  cairo_t * cr2 = cairo_reference(cr1);

  // 获取surface对象的引用计数
  count1 = cairo_surface_get_reference_count(sfc2);
  // 获取cairo对象的引用计数
  count2 = cairo_get_reference_count(cr2);

  printf("获取新引用后：\nsurface对象的引用计数: %u\ncairo对象的引用计数： %u\n\n", count1, count2);  

  // 创建新的指向surface对象的指针
  cairo_surface_t *sfc3 = sfc1;
  // 创建新的指向cairo对象的指针
  cairo_t * cr3 = cr1;

  printf("创建新指针后：\nsurface对象的引用计数: %u\ncairo对象的引用计数： %u\n可见单纯创建新指针并不会增加对象的引用计数\n\n", count1, count2); 

  // 释放对cairo对象的两个引用，从而销毁cairo对象
  cairo_destroy(cr1);
  cairo_destroy(cr2); 

  count1 = cairo_surface_get_reference_count(sfc1);
  printf("销毁cairo对象后surface对象的引用计数：%u\n可见销毁cairo对象时会自动释放创建它时获取的两个对surface对象的引用\n", count1);

  return 0;
}//main